/*
 * Copyright (c) 2010 Zauber S.A.  -- All rights reserved
 */
package ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.bitwise.visitors;

import java.util.List;

import org.apache.commons.lang.Validate;

import ar.edu.itba.ia2010.geneticos.motor.api.Cromosoma;
import ar.edu.itba.ia2010.geneticos.motor.api.EstrategiaCorte;
import ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.Expresion;
import ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.bitwise.ExpresionCromosoma;

/**
 * Estrategia de corte decorada; que reduce las expresiones.
 * 
 * @author Juan F. Codagnone
 * @since Apr 3, 2010
 */
public class EditorEstrategiaCorte implements EstrategiaCorte<Expresion> {
    private final EstrategiaCorte<Expresion> target;
    private final int iteracionesParaReducir;
    private int i = 1;
    private final boolean[][] cases;
    
    /** Creates the EditorEstrategiaCorte. */
    public EditorEstrategiaCorte(
            final int iteracionesParaReducir,
            final EstrategiaCorte<Expresion> target,
            final boolean[][]cases) {
        Validate.isTrue(iteracionesParaReducir > 0);
        Validate.notNull(target);
        
        this.iteracionesParaReducir = iteracionesParaReducir; 
        this.target = target;
        this.cases = cases;
    }
    
    /** @see EstrategiaCorte#nextAge(java.util.List) */
    public final boolean nextAge(final List<Cromosoma<Expresion>> poblacion) {
        i++;
        if(i % iteracionesParaReducir == 0) {
            for(final Cromosoma<Expresion> c : poblacion) {
                ((ExpresionCromosoma)c).reducir(cases);
            }
        }
        return target.nextAge(poblacion);
    }
}
